/**
 * 无符号整数
 *   unsigned short int
 *   unsigned int
 *   unsigned long int
 *   unsigned long long int
 * 
 * 奇怪的是，C++ 标准明确指出“涉及无符号操作数的计算永远不会溢出”。这与整数溢出涵盖有符号和无符号用例的一般编程共识相反
 * 该数字280太大，无法容纳在 0 到 255 的 1 字节范围内。比该类型的最大数字 256 大 1。因此，我们将 280 除以 256，得到 1 余数 24。24 的余数是存储。
 * 这是思考同一件事的另一种方式。任何大于该类型可表示的最大数字的数字都会简单地“环绕”（有时称为“模环绕”）。
 * 255在 1 字节整数范围内，所以255没问题。256然而，超出了范围，因此它回绕到值0。257环绕到 value 1。280环绕到 value 24。
 * 
 * 最佳实践
 * 在保存数量（甚至应该是非负的数量）和数学运算时，优先选择有符号数而不是无符号数。避免混合有符号数和无符号数。
 * 
 */

#include <iostream>

int main()
{
    unsigned short us;
    unsigned int ui;
    unsigned long ul;
    unsigned long long ull;



    unsigned short x{ 65535 }; // largest 16-bit unsigned value possible
    std::cout << "x was: " << x << '\n';

    x = 65536; // 65536 is out of our range, so we get modulo wrap-around
    std::cout << "x is now: " << x << '\n';

    x = 65537; // 65537 is out of our range, so we get modulo wrap-around
    std::cout << "x is now: " << x << '\n';



    unsigned int x1{ 2 };
	unsigned int y1{ 3 };

	std::cout << x1 - y1 << '\n'; // 2 - 3 = 4294967295



    unsigned int u{ 2 };
	signed int s{ 3 };

	std::cout << u - s << '\n'; // 2 - 3 = 4294967295



    signed int s1 { -1 };
    unsigned int u1 { 1 };

    if (s1 < u1) // -1 is implicitly converted to 4294967295, and 4294967295 < 1 is false
        std::cout << "-1 is less than 1\n";
    else
        std::cout << "1 is less than -1\n"; // this statement executes



    return 0;
}